{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# সিফ্ট কেরাসের সাথে ব্যক্তিগত ভবিষ্যদ্বাণী (Private Predictions with Syft Keras)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## পদক্ষেপ 3: সিফ্ট কেরাস ব্যবহার করে ব্যক্তিগত ভবিষ্যদ্বাণী - পরিবেশন করা (ক্লায়েন্ট)  (Private Prediction using Syft Keras - Serving (Client)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "অভিনন্দন! আপনার মডেলটিকে সাধারণ কেরাস দিয়ে প্রশিক্ষণ দেওয়ার পরে এবং এটি সিফ্ট কেরাস দিয়ে সুরক্ষিত করার পরে, আপনি কিছু ব্যক্তিগত ভবিষ্যদ্বাণীগুলির অনুরোধ করতে প্রস্তুত।"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "অনুবাদক:\n",
    "\n",
    "- Sourav Das - Twitter: [@adventuroussrv](https://twitter.com/adventuroussrv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.datasets import mnist\n",
    "\n",
    "import syft as sy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ডেটা (Data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "এখানে, আমরা আমাদের এমএনআইএসটি ডেটা(MNIST data) প্রাক প্রক্রিয়াজাত(preprocessed) করি। এটি আমরা প্রশিক্ষণের সময় যেভাবে প্রাক-প্রক্রিয়াজাতকরণের সেই অনুরূপ।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# input image dimensions\n",
    "img_rows, img_cols = 28, 28\n",
    "\n",
    "# the data, split between train and test sets\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "\n",
    "x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)\n",
    "x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)\n",
    "input_shape = (img_rows, img_cols, 1)\n",
    "\n",
    "x_train = x_train.astype('float32')\n",
    "x_test = x_test.astype('float32')\n",
    "x_train /= 255\n",
    "x_test /= 255"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## মডেলটি সংযুক্ত করুন (Connect to model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "মডেলটি জিজ্ঞাসাবাদ করার আগে, আপনাকে এটির সাথে সংযোগ করতে হবে। এটি করতে, আপনি একটি ক্লায়েন্ট তৈরি করতে পারেন। তারপর সঠিক একই তিন TFEWorkers (alice, bob এবং carol) এবং ক্লাস্টার। অবশেষে কল করুন connect_to_model। এটি ক্লায়েন্ট সাইডে একটি TFE জিজ্ঞাসাবাদ সার্ভার তৈরি করে model.serve() যা Part 13b দ্বারা স্থাপন করা কুইউং সার্ভারের সাথে সংযোগ স্থাপন করে । পূর্বাভাসের অনুরোধে শেয়ারগুলি জমা দেওয়ার আগে সহজ লেখা ডেটা গোপনে ভাগ করে নেওয়ার জন্য সারিটি দায়বদ্ধ থাকবে।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_classes = 10\n",
    "input_shape = (1, 28, 28, 1)\n",
    "output_shape = (1, num_classes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:tf_encrypted:Starting session on target 'grpc://localhost:4000' using config graph_options {\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "client = sy.TFEWorker()\n",
    "\n",
    "alice = sy.TFEWorker(host='localhost:4000')\n",
    "bob = sy.TFEWorker(host='localhost:4001')\n",
    "carol = sy.TFEWorker(host='localhost:4002')\n",
    "cluster = sy.TFECluster(alice, bob, carol)\n",
    "\n",
    "client.connect_to_model(input_shape, output_shape, cluster)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## অনুসন্ধান মডেল (Query model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "আপনি কিছু ব্যক্তিগত ভবিষ্যদ্বাণী পেতে প্রস্তুত! query_model কল করা চিত্রটিকে উপরের তৈরি কাতারে সন্নিবেশ করবে, গোপনীয়ভাবে স্থানীয়ভাবে ডেটা ভাগ করবে এবং Part 13b তে মডেল সার্ভারে শেয়ার জমা দেবে।"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# User inputs\n",
    "num_tests = 3\n",
    "images, expected_labels = x_test[:num_tests], y_test[:num_tests]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The image had label 7 and was correctly classified as 7\n",
      "The image had label 2 and was correctly classified as 2\n",
      "The image had label 1 and was correctly classified as 1\n"
     ]
    }
   ],
   "source": [
    "for image, expected_label in zip(images, expected_labels):\n",
    "\n",
    "    res = client.query_model(image.reshape(1, 28, 28, 1))\n",
    "    predicted_label = np.argmax(res)\n",
    "\n",
    "    print(\"The image had label {} and was {} classified as {}\".format(\n",
    "        expected_label,\n",
    "        \"correctly\" if expected_label == predicted_label else \"wrongly\",\n",
    "        predicted_label))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "এটা অসাধারণ. আপনি এই তিনটি চিত্রকে সঠিকভাবে শ্রেণিবদ্ধ করতে সক্ষম! তবে এই পূর্বাভাসগুলির মধ্যে বিশেষটি হ'ল আপনি এই পরিষেবাটি পাওয়ার জন্য কোনও ব্যক্তিগত তথ্য প্রকাশ করেন নি। মডেল হোস্ট আপনার ইনপুট ডেটা বা আপনার পূর্বাভাস কখনও দেখেনি এবং আপনি কখনও মডেলটি ডাউনলোড করেন নি। আপনি একটি এনক্রিপ্ট করা মডেল সহ এনক্রিপ্ট করা ডেটাতে ব্যক্তিগত ভবিষ্যদ্বাণী পেতে সক্ষম হয়েছিলেন!\n",
    "\n",
    "এটি আমাদের নিজস্ব অ্যাপ্লিকেশনগুলিতে প্রয়োগ করার জন্য ছুটে যাওয়ার আগে, আমাদের পরিবেশন করা মডেলটি পরিষ্কার করতে দ্রুত  Part 13b তে ফিরে যাই!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.17"
  },
  "nbTranslate": {
   "displayLangs": [
    "*"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "fr",
   "useGoogleTranslate": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
